package observer

import "fmt"

// Subject 定义主题
type Subject interface {
	//AddObserver 添加观察者
	AddObserver(b Observer)
	//RmObserver 移除观察者
	RmObserver(b Observer)
	//NotifyAll 通知所有观察者
	NotifyAll(msg string)
}

type HotData struct {
	ObserverList []Observer
}

// AddObserver 添加观察者
func (h *HotData) AddObserver(b Observer) {
	h.ObserverList = append(h.ObserverList, b)
}

// RmObserver 移除观察者
func (h *HotData) RmObserver(b Observer) {
	for idx, obj := range h.ObserverList {
		if obj == b {
			h.ObserverList = append(h.ObserverList[:idx], h.ObserverList[idx+1:]...)
			break
		}
	}
}

// NotifyAll 通知所有观察者消息
func (h *HotData) NotifyAll(msg string) {
	for _, obj := range h.ObserverList {
		obj.SendMsg(msg)
	}
}

// Observer 定义观察者
type Observer interface {
	//SendMsg 观察者发送消息
	SendMsg(msg string)
}

type Tiktok struct {
	Name string
}

func (t Tiktok) SendMsg(msg string) {
	fmt.Println(fmt.Printf("%s正在发送%s", t.Name, msg))
}

type Bilibili struct {
	Name string
}

func (b Bilibili) SendMsg(msg string) {
	fmt.Println(fmt.Printf("%s正在发送%s", b.Name, msg))
}

type TencentVideo struct {
	Name string
}

func (t TencentVideo) SendMsg(msg string) {
	fmt.Println(fmt.Printf("%s正在发送%s", t.Name, msg))
}
